﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;

namespace SisCRA.Database
{
    public class StudentEnrollmentAvaliationDAL
    {
        #region -Constants-

        private const string TABLE = "ALUNO-DISCIPLINA-ATIVIDADE";
        private const string INSERT_STUDENT_DISCIPLINE_ACTIVITY = "INSERT INTO T_ALUNO_DISCIPLINA_ATIVIDADE (FK_ALUNO_ID, FK_DISCIPLINA_ID, FK_ATIVIDADE_ID, DN_NOTA) VALUES (@ALUNO_ID, @DISCIPLINA_ID, @ATIVIDADE_ID, @NOTA)";
        private const string UPDATE_STUDENT_DISCIPLINE_ACTIVITY = "UPDATE T_ALUNO_DISCIPLINA_ATIVIDADE SET DN_NOTA = @NOTA WHERE FK_ALUNO_ID = @ALUNO_ID AND FK_DISCIPLINA_ID = @DISCIPLINA_ID AND FK_ATIVIDADE_ID = @ATIVIDADE_ID";
        private const string GET_STUDENT_ENROLLMENT_AVALIATION = "SELECT FK_ALUNO_ID AS ALUNO_ID, FK_DISCIPLINA_ID AS DISCIPLINA_ID, FK_ATIVIDADE_ID AS ATIVIDADE_ID, DN_NOTA AS NOTA FROM T_ALUNO_DISCIPLINA_ATIVIDADE WHERE FK_ALUNO_ID = @ALUNO_ID AND FK_DISCIPLINA_ID = @DISCIPLINA_ID AND FK_ATIVIDADE_ID = @ATIVIDADE_ID";
        private const string GET_STUDENT_ENROLLMENT_AVALIATION_BY_DISCIPLINE = "SELECT FK_ALUNO_ID AS ALUNO_ID, FK_DISCIPLINA_ID AS DISCIPLINA_ID, FK_ATIVIDADE_ID AS ATIVIDADE_ID, DN_NOTA AS NOTA FROM T_ALUNO_DISCIPLINA_ATIVIDADE WHERE FK_DISCIPLINA_ID = @DISCIPLINA_ID";
        private const string GET_AVALIATION_BY_DISCIPLINE_AND_STUDENT = "SELECT * FROM V_ALUNO_DISCIPLINA_ATIVIDADE WHERE DISCIPLINA_ID = @DISCIPLINA_ID AND ALUNO_ID = @ALUNO_ID";

        #endregion

        #region -Private Attributes-

        MySqlConnection conn;
        MySqlCommand cmd;
        MySqlDataAdapter da;

        #endregion

        #region -Public Methods-

        /// <summary>
        /// Método que insere uma relação Aluno-Disciplina-Atividade no banco de dados.
        /// </summary>
        /// <param name="studentId">Id do aluno</param>
        /// <param name="disciplineId">Id da disciplina</param>
        /// <param name="activityId">Id da atividade</param>
        /// <param name="grade">Nota do aluno</param>
        public void InsertStudentDisciplineActivity(int studentId, int disciplineId, int activityId, double grade)
        {
            try
            {
                using (conn = Connection.Instance.Conn)
                {
                    conn.Open();
                    using (cmd = new MySqlCommand(INSERT_STUDENT_DISCIPLINE_ACTIVITY, conn))
                    {
                        cmd.Parameters.AddWithValue("@ALUNO_ID", studentId);
                        cmd.Parameters.AddWithValue("@DISCIPLINA_ID", disciplineId);
                        cmd.Parameters.AddWithValue("@ATIVIDADE_ID", activityId);
                        cmd.Parameters.AddWithValue("@NOTA", grade);

                        cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Método que atualiza uma relação Aluno-Disciplina-Atividade no banco de dados.
        /// </summary>
        /// <param name="studentId">Id do aluno</param>
        /// <param name="disciplineId">Id da disciplina</param>
        /// <param name="activityId">Id da atividade</param>
        /// <param name="grade">Nota do aluno</param>
        public void UpdateStudentDisciplineActivity(int studentId, int disciplineId, int activityId, double grade)
        {
            try
            {
                using (conn = Connection.Instance.Conn)
                {
                    conn.Open();
                    using (cmd = new MySqlCommand(UPDATE_STUDENT_DISCIPLINE_ACTIVITY, conn))
                    {
                        cmd.Parameters.AddWithValue("@NOTA", grade);
                        cmd.Parameters.AddWithValue("@ALUNO_ID", studentId);
                        cmd.Parameters.AddWithValue("@DISCIPLINA_ID", disciplineId);
                        cmd.Parameters.AddWithValue("@ATIVIDADE_ID", activityId);

                        cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Método que busca uma relação Aluno-Disciplina-Atividade no banco de dados.
        /// </summary>
        /// <param name="studentId">Id do aluno</param>
        /// <param name="disciplineId">Id da disciplina</param>
        /// <param name="activityId">Id da atividade</param>
        /// <returns>DataTable contendo a busca realizada</returns>
        public DataTable GetStudentEnrollmentAvaliation(int studentId, int disciplineId, int activityId)
        {
            DataTable dt = new DataTable(TABLE);

            try
            {
                using (conn = Connection.Instance.Conn)
                {
                    conn.Open();
                    using (cmd = new MySqlCommand(GET_STUDENT_ENROLLMENT_AVALIATION, conn))
                    {
                        cmd.Parameters.AddWithValue("@ALUNO_ID", studentId);
                        cmd.Parameters.AddWithValue("@DISCIPLINA_ID", disciplineId);
                        cmd.Parameters.AddWithValue("@ATIVIDADE_ID", activityId);
                        using (da = new MySqlDataAdapter())
                        {
                            da.SelectCommand = cmd;
                            da.Fill(dt);
                        }
                    }
                }

                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Método que busca todas as relações Aluno-Disciplina-Atividade no banco de dados pela disciplina.
        /// </summary>
        /// <param name="disciplineId">Id da disciplina</param>
        /// <returns>DataTable contendo a busca realizada</returns>
        public DataTable GetStudentEnrollmentAvaliationByDiscipline(int disciplineId)
        {
            DataTable dt = new DataTable(TABLE);

            try
            {
                using (conn = Connection.Instance.Conn)
                {
                    conn.Open();
                    using (cmd = new MySqlCommand(GET_STUDENT_ENROLLMENT_AVALIATION_BY_DISCIPLINE, conn))
                    {
                        cmd.Parameters.AddWithValue("@DISCIPLINA_ID", disciplineId);
                        using (da = new MySqlDataAdapter())
                        {
                            da.SelectCommand = cmd;
                            da.Fill(dt);
                        }
                    }
                }

                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Método que busca as avaliações por aluno e disciplina.
        /// </summary>
        /// <param name="disciplineId">Id da disciplina</param>
        /// <param name="studentId">Id do aluno</param>
        /// <returns>DataTable contendo a busca realizada</returns>
        public DataTable GetAvaliationByDisciplineAndStudent(int disciplineId, int studentId)
        {
            DataTable dt = new DataTable(TABLE);

            try
            {
                using (conn = Connection.Instance.Conn)
                {
                    conn.Open();
                    using (cmd = new MySqlCommand(GET_AVALIATION_BY_DISCIPLINE_AND_STUDENT, conn))
                    {
                        cmd.Parameters.AddWithValue("@DISCIPLINA_ID", disciplineId);
                        cmd.Parameters.AddWithValue("@ALUNO_ID", studentId);
                        using (da = new MySqlDataAdapter())
                        {
                            da.SelectCommand = cmd;
                            da.Fill(dt);
                        }
                    }
                }

                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion
    }
}
